ক্লোজার (Clojure) একটি JVM (Java Virtual Machine) ভিত্তিক ভাষা, যার ফলে এটি জাভার সাথে সরাসরি ইন্টারঅ্যাক্ট করতে পারে। Clojure প্রোগ্রামিং ভাষাটি জাভার লাইব্রেরি ও API ব্যবহার করার সুযোগ দেয়, যা ক্লোজারের ক্ষমতাকে আরও বাড়িয়ে তোলে। Java Interoperability এর মাধ্যমে ক্লোজারের প্রোগ্রামাররা জাভার লাইব্রেরি এবং ক্লাসগুলো সহজে ক্লোজার কোডে অন্তর্ভুক্ত করতে পারেন।
Java Interoperability ক্লোজারে বিভিন্ন উপায়ে করা যায়। নিচে ক্লোজারে জাভা কোড ব্যবহারের কিছু পদ্ধতি আলোচনা করা হলো।
ক্লোজারে জাভার স্ট্যাটিক মেথড কল করতে ClassName/methodName
সিনট্যাক্স ব্যবহার করা হয়।
pow
ব্যবহার করা(Math/pow 2 3)
; আউটপুট: 8.0
এখানে Math/pow
মেথডটি 2
এবং 3
প্যারামিটার নিয়ে 2^3 = 8
ফলাফল প্রদান করে।
জাভার কোনো অবজেক্টের ইনস্ট্যান্স মেথড কল করতে ক্লোজারে (.methodName instance arguments)
সিনট্যাক্স ব্যবহার করা হয়।
toUpperCase
ব্যবহার করা(def my-string "hello world")
(.toUpperCase my-string)
; আউটপুট: "HELLO WORLD"
এখানে, .toUpperCase
মেথডটি my-string
অবজেক্টের উপর প্রয়োগ করা হয়েছে, যা সকল অক্ষরকে বড় করে রিটার্ন করে।
জাভার কনস্ট্রাক্টর ব্যবহার করে ক্লোজারে নতুন অবজেক্ট তৈরি করতে new
ফাংশন বা ClassName.
সিনট্যাক্স ব্যবহার করা হয়।
ArrayList
অবজেক্ট তৈরি করা(def my-list (new java.util.ArrayList))
; অথবা
(def my-list (java.util.ArrayList.))
উপরের উভয় পদ্ধতিই ArrayList
ক্লাসের একটি নতুন অবজেক্ট তৈরি করবে।
জাভার কোনো অবজেক্টের ফিল্ড অ্যাক্সেস করতে (.fieldName instance)
সিনট্যাক্স ব্যবহার করা হয়। স্ট্যাটিক ফিল্ডের ক্ষেত্রে ClassName/fieldName
ব্যবহার করা হয়।
Math
ক্লাসের PI
ফিল্ড ব্যবহার করাMath/PI
; আউটপুট: 3.141592653589793
এখানে Math/PI
ফিল্ডটি Math
ক্লাস থেকে সরাসরি অ্যাক্সেস করা হয়েছে।
ক্লোজারে proxy
ব্যবহার করে জাভার ইন্টারফেস ইমপ্লিমেন্ট করা যায়। এটি জাভার Runnable
বা ActionListener
এর মতো ইন্টারফেসগুলোর জন্য কার্যকর।
(defn run-task []
(proxy [java.lang.Runnable] []
(run [] (println "Task is running..."))))
(.start (Thread. (run-task)))
; আউটপুট: "Task is running..."
এখানে Runnable
ইন্টারফেস ইমপ্লিমেন্ট করে একটি Thread
তৈরি করা হয়েছে, যা run
মেথডে প্রিন্ট স্টেটমেন্টটি চালায়।
ক্লোজারে import
ব্যবহার করে এক বা একাধিক জাভা লাইব্রেরি আমদানি করা যায়।
Date
ক্লাস আমদানি এবং ব্যবহার করা(import '[java.util Date])
(def current-date (Date.))
(println current-date)
; আউটপুট: বর্তমান তারিখ এবং সময়
Java Interoperability এর মাধ্যমে ক্লোজার প্রোগ্রামাররা জাভার প্রচুর লাইব্রেরি এবং ক্লাস ব্যবহার করতে পারেন। ক্লোজারের এই ক্ষমতা তার প্রোগ্রামারদের জন্য কোড পুনঃব্যবহার এবং জাভার ইকোসিস্টেমের শক্তিশালী টুল এবং API ব্যবহার করার সুযোগ প্রদান করে।
পদ্ধতি | ব্যবহার |
---|---|
স্ট্যাটিক মেথড কল | Math/pow |
ইনস্ট্যান্স মেথড কল | (.toUpperCase my-string) |
কনস্ট্রাক্টর ব্যবহার | (java.util.ArrayList.) |
ফিল্ড অ্যাক্সেস | Math/PI |
ইন্টারফেস ইমপ্লিমেন্ট | proxy [java.lang.Runnable] |
লাইব্রেরি আমদানি | (import '[java.util Date]) |
Java Interoperability এর মাধ্যমে ক্লোজারে জাভার বিভিন্ন ক্ষমতা যুক্ত করা যায়, যা বড় প্রজেক্ট এবং মাল্টি-ফাংশনাল অ্যাপ্লিকেশন তৈরিতে সাহায্য করে।
ক্লোজার (Clojure) একটি JVM (Java Virtual Machine) ভিত্তিক ভাষা, যার ফলে এটি জাভার সাথে সরাসরি ইন্টারঅ্যাক্ট করতে পারে। Clojure প্রোগ্রামিং ভাষাটি জাভার লাইব্রেরি ও API ব্যবহার করার সুযোগ দেয়, যা ক্লোজারের ক্ষমতাকে আরও বাড়িয়ে তোলে। Java Interoperability এর মাধ্যমে ক্লোজারের প্রোগ্রামাররা জাভার লাইব্রেরি এবং ক্লাসগুলো সহজে ক্লোজার কোডে অন্তর্ভুক্ত করতে পারেন।
Java Interoperability ক্লোজারে বিভিন্ন উপায়ে করা যায়। নিচে ক্লোজারে জাভা কোড ব্যবহারের কিছু পদ্ধতি আলোচনা করা হলো।
ক্লোজারে জাভার স্ট্যাটিক মেথড কল করতে ClassName/methodName
সিনট্যাক্স ব্যবহার করা হয়।
pow
ব্যবহার করা(Math/pow 2 3)
; আউটপুট: 8.0
এখানে Math/pow
মেথডটি 2
এবং 3
প্যারামিটার নিয়ে 2^3 = 8
ফলাফল প্রদান করে।
জাভার কোনো অবজেক্টের ইনস্ট্যান্স মেথড কল করতে ক্লোজারে (.methodName instance arguments)
সিনট্যাক্স ব্যবহার করা হয়।
toUpperCase
ব্যবহার করা(def my-string "hello world")
(.toUpperCase my-string)
; আউটপুট: "HELLO WORLD"
এখানে, .toUpperCase
মেথডটি my-string
অবজেক্টের উপর প্রয়োগ করা হয়েছে, যা সকল অক্ষরকে বড় করে রিটার্ন করে।
জাভার কনস্ট্রাক্টর ব্যবহার করে ক্লোজারে নতুন অবজেক্ট তৈরি করতে new
ফাংশন বা ClassName.
সিনট্যাক্স ব্যবহার করা হয়।
ArrayList
অবজেক্ট তৈরি করা(def my-list (new java.util.ArrayList))
; অথবা
(def my-list (java.util.ArrayList.))
উপরের উভয় পদ্ধতিই ArrayList
ক্লাসের একটি নতুন অবজেক্ট তৈরি করবে।
জাভার কোনো অবজেক্টের ফিল্ড অ্যাক্সেস করতে (.fieldName instance)
সিনট্যাক্স ব্যবহার করা হয়। স্ট্যাটিক ফিল্ডের ক্ষেত্রে ClassName/fieldName
ব্যবহার করা হয়।
Math
ক্লাসের PI
ফিল্ড ব্যবহার করাMath/PI
; আউটপুট: 3.141592653589793
এখানে Math/PI
ফিল্ডটি Math
ক্লাস থেকে সরাসরি অ্যাক্সেস করা হয়েছে।
ক্লোজারে proxy
ব্যবহার করে জাভার ইন্টারফেস ইমপ্লিমেন্ট করা যায়। এটি জাভার Runnable
বা ActionListener
এর মতো ইন্টারফেসগুলোর জন্য কার্যকর।
(defn run-task []
(proxy [java.lang.Runnable] []
(run [] (println "Task is running..."))))
(.start (Thread. (run-task)))
; আউটপুট: "Task is running..."
এখানে Runnable
ইন্টারফেস ইমপ্লিমেন্ট করে একটি Thread
তৈরি করা হয়েছে, যা run
মেথডে প্রিন্ট স্টেটমেন্টটি চালায়।
ক্লোজারে import
ব্যবহার করে এক বা একাধিক জাভা লাইব্রেরি আমদানি করা যায়।
Date
ক্লাস আমদানি এবং ব্যবহার করা(import '[java.util Date])
(def current-date (Date.))
(println current-date)
; আউটপুট: বর্তমান তারিখ এবং সময়
Java Interoperability এর মাধ্যমে ক্লোজার প্রোগ্রামাররা জাভার প্রচুর লাইব্রেরি এবং ক্লাস ব্যবহার করতে পারেন। ক্লোজারের এই ক্ষমতা তার প্রোগ্রামারদের জন্য কোড পুনঃব্যবহার এবং জাভার ইকোসিস্টেমের শক্তিশালী টুল এবং API ব্যবহার করার সুযোগ প্রদান করে।
পদ্ধতি | ব্যবহার |
---|---|
স্ট্যাটিক মেথড কল | Math/pow |
ইনস্ট্যান্স মেথড কল | (.toUpperCase my-string) |
কনস্ট্রাক্টর ব্যবহার | (java.util.ArrayList.) |
ফিল্ড অ্যাক্সেস | Math/PI |
ইন্টারফেস ইমপ্লিমেন্ট | proxy [java.lang.Runnable] |
লাইব্রেরি আমদানি | (import '[java.util Date]) |
Java Interoperability এর মাধ্যমে ক্লোজারে জাভার বিভিন্ন ক্ষমতা যুক্ত করা যায়, যা বড় প্রজেক্ট এবং মাল্টি-ফাংশনাল অ্যাপ্লিকেশন তৈরিতে সাহায্য করে।
Java একটি অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং ভাষা, যেখানে কোড সাধারণত ক্লাস এবং অবজেক্ট এর মাধ্যমে সংগঠিত হয়। একটি ক্লাস হল অবজেক্ট তৈরির একটি ব্লুপ্রিন্ট, এবং মেথড হল ক্লাসের ভিতরে থাকা একটি ফাংশন যা নির্দিষ্ট কাজ সম্পাদন করে। Java তে ক্লাস এবং মেথড ব্যবহারের মাধ্যমে আপনি কার্যকরী এবং পুনঃব্যবহারযোগ্য কোড তৈরি করতে পারেন।
Java তে একটি ক্লাস তৈরি করতে class
কিওয়ার্ড ব্যবহার করা হয়। ক্লাসটি এক বা একাধিক অবজেক্ট তৈরি করতে ব্যবহৃত হয় এবং এটি বিভিন্ন প্রপার্টি (ফিল্ড) এবং আচরণ (মেথড) ধারণ করে।
public class ClassName {
// ফিল্ড বা প্রপার্টি
int field;
// কন্সট্রাকটর (এটি অবজেক্ট তৈরি করতে ব্যবহৃত হয়)
public ClassName(int value) {
field = value;
}
// মেথড
public void display() {
System.out.println("Field value: " + field);
}
}
public class ClassName
: ClassName
নামক একটি ক্লাস তৈরি করা হয়েছে।int field
: একটি ফিল্ড (অথবা প্রপার্টি) যা অবজেক্টের অবস্থা (state) ধারণ করে।public void display()
: একটি মেথড যা field
এর মান প্রদর্শন করবে।Java তে মেথড হল এমন একটি ব্লক যা নির্দিষ্ট কাজ করে এবং সাধারণত কিছু ইনপুট গ্রহণ করে এবং আউটপুট রিটার্ন করে (যদি ফাংশনটি void
না হয়)। মেথডগুলি ক্লাসের অংশ হিসেবে ব্যবহৃত হয় এবং সাধারণত কিছু কাজ করার জন্য একাধিক মেথড ব্যবহার করা হয়।
public returnType methodName(parameter1, parameter2, ...) {
// মেথডের কাজ
}
public
– অ্যাক্সেস মডিফায়ার যা বলে মেথডটি কোথা থেকে অ্যাক্সেস করা যাবে।returnType
– মেথডটি কী ধরনের ডেটা রিটার্ন করবে (যেমন int
, String
, void
ইত্যাদি)।methodName
– মেথডের নাম।parameter1, parameter2, ...
– মেথডের ইনপুট (যদি থাকে)।public class Calculator {
// একটি মেথড যা দুটি সংখ্যার যোগফল ফেরত দেয়
public int add(int num1, int num2) {
return num1 + num2;
}
public static void main(String[] args) {
// Calculator ক্লাসের একটি অবজেক্ট তৈরি করা
Calculator calc = new Calculator();
// add মেথড কল করা
int result = calc.add(5, 7);
// ফলাফল প্রদর্শন করা
System.out.println("The sum is: " + result);
}
}
এখানে, add
মেথড দুটি ইনপুট গ্রহণ করে এবং তাদের যোগফল রিটার্ন করে। main
মেথডে আমরা add
মেথডটি কল করে দুইটি সংখ্যা যোগ করছি।
Java তে কন্সট্রাকটর একটি বিশেষ মেথড যা অবজেক্ট তৈরি করার সময় স্বয়ংক্রিয়ভাবে কল হয়। এটি অবজেক্টের প্রাথমিক অবস্থা সেট করতে ব্যবহৃত হয়।
public ClassName() {
// কন্সট্রাকটরের কাজ
}
কন্সট্রাকটরের নাম অবশ্যই ক্লাসের নামের সাথে মিলতে হবে এবং এটি রিটার্ন টাইপ ধারণ করে না।
public class Person {
// ফিল্ড
String name;
int age;
// কন্সট্রাকটর
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// মেথড
public void display() {
System.out.println("Name: " + name);
System.out.println("Age: " + age);
}
public static void main(String[] args) {
// কন্সট্রাকটর ব্যবহার করে অবজেক্ট তৈরি
Person person1 = new Person("Alice", 25);
// display মেথড কল করা
person1.display();
}
}
এখানে, Person
ক্লাসের একটি কন্সট্রাকটর তৈরি করা হয়েছে যা name
এবং age
ইনপুট নিয়ে সেই মানগুলিকে ফিল্ডে সেট করে। main
মেথডে Person
অবজেক্ট তৈরি করা হয়েছে এবং display
মেথড কল করা হয়েছে।
ক্লাসে নির্দিষ্ট কাজের জন্য মেথড এবং কন্সট্রাকটরের সাহায্যে অবজেক্ট তৈরি করা হয় এবং সেই অবজেক্টের মাধ্যমে মেথড কল করা হয়।
public class Car {
// ফিল্ড
String model;
int year;
// কন্সট্রাকটর
public Car(String model, int year) {
this.model = model;
this.year = year;
}
// মেথড
public void start() {
System.out.println(model + " is starting...");
}
public static void main(String[] args) {
// Car ক্লাসের একটি অবজেক্ট তৈরি
Car myCar = new Car("Toyota Corolla", 2020);
// start মেথড কল করা
myCar.start(); // আউটপুট: Toyota Corolla is starting...
}
}
এখানে, Car
ক্লাসে একটি কন্সট্রাকটর এবং একটি মেথড start
রয়েছে, যা গাড়ি শুরু করার কাজ করবে। main
মেথডে Car
ক্লাসের অবজেক্ট তৈরি করা হয়েছে এবং start
মেথড কল করা হয়েছে।
বিষয় | ব্যাখ্যা |
---|---|
ক্লাস | অবজেক্ট তৈরি করার জন্য একটি ব্লুপ্রিন্ট |
মেথড | নির্দিষ্ট কাজ সম্পাদন করা ফাংশন |
কন্সট্রাকটর | অবজেক্ট তৈরি করার সময় কল হয়, অবজেক্টের প্রাথমিক মান সেট করে |
অবজেক্ট | ক্লাসের ইনস্ট্যান্স, যার মাধ্যমে মেথড কল এবং ডেটা অ্যাক্সেস করা হয় |
Java তে ক্লাস এবং মেথড ব্যবহার করে কোডকে সংগঠিত, পুনঃব্যবহারযোগ্য এবং পরিষ্কারভাবে তৈরি করা হয়।
Clojure এবং Java, উভয়ই প্রোগ্রামিং ভাষা হলেও, তাদের সংগ্রহ (collections) ব্যবস্থাপনায় অনেক পার্থক্য রয়েছে। Java-তে যে সমস্ত Collections Framework ব্যবহৃত হয়, Clojure-এ তার কিছু পরিবর্তিত রূপ পাওয়া যায় যা ফাংশনাল প্রোগ্রামিংয়ের জন্য উপযোগী এবং ইমিউটেবল (immutable)। আসুন, Java এবং Clojure এর সংগ্রহ ব্যবস্থাপনা (collections management) এর মধ্যে প্রধান পার্থক্যগুলো দেখি।
Clojure: Clojure-এ সব ডেটা কাঠামো ইমিউটেবল। অর্থাৎ, একবার একটি ডেটা স্ট্রাকচার তৈরি হলে, তার মান পরিবর্তন করা সম্ভব নয়। পরিবর্তে, নতুন স্ট্রাকচার তৈরি করা হয়। এই বৈশিষ্ট্যটি ফাংশনাল প্রোগ্রামিং এর মূল ধারণা অনুসরণ করে।
Java: Java-তে, অধিকাংশ Collection মিউটেবল (mutable)। অর্থাৎ, আপনি একটি List, Set, বা Map এর মান সরাসরি পরিবর্তন করতে পারেন। উদাহরণস্বরূপ, ArrayList
-এ আইটেম যোগ বা মুছে ফেলা যেতে পারে।
Clojure:
(def my-list (conj [] 1 2 3)) ; [] -> [1 2 3]
Java:
List<Integer> myList = new ArrayList<>();
myList.add(1);
myList.add(2);
myList.add(3); // mutable, directly changing the list
Clojure: Clojure একটি মাল্টি-থ্রেডেড পরিবেশ তৈরি করতে খুব উপযোগী। Clojure এর ইমিউটেবল সংগ্রহগুলি থ্রেড সেফ (thread-safe), এবং Clojure এ কনকারেন্ট প্রোগ্রামিং করার জন্য Atom
, Ref
, Agent
ইত্যাদি ব্যবহৃত হয়।
Java: Java-তে Collections সাধারণত মাল্টি-থ্রেড সেফ নয়, তবে আপনি synchronized
ব্লক বা Concurrent
লাইব্রেরির Concurrent Collections ব্যবহার করে মাল্টি-থ্রেডিং নিরাপদ করতে পারেন।
Clojure:
(def my-atom (atom 0))
(swap! my-atom inc) ; Atom ensures safe updates in a concurrent environment
Java:
List<Integer> myList = Collections.synchronizedList(new ArrayList<>());
synchronized(myList) {
myList.add(1);
}
Clojure: Clojure-এ সমস্ত Collection গুলি ফাংশনাল প্রোগ্রামিংয়ের সাথে উপযোগী। map
, filter
, reduce
এবং অন্যান্য ফাংশনাল অপারেটর ব্যবহার করে সংগ্রহের উপাদানগুলোর সাথে অপারেশন করা হয়।
Java: Java 8 থেকে Streams API এর মাধ্যমে কিছু ফাংশনাল স্টাইলের অপারেশন (যেমন map
, filter
, reduce
) চালানো সম্ভব হয়েছে, তবে Java এর Collections Framework আরও অনেক বেশি অবজেক্ট ওরিয়েন্টেড।
Clojure:
(def my-list [1 2 3 4 5])
(map inc my-list) ; (2 3 4 5 6)
Java:
List<Integer> myList = Arrays.asList(1, 2, 3, 4, 5);
myList.stream().map(n -> n + 1).collect(Collectors.toList()); // [2, 3, 4, 5, 6]
Clojure: Clojure একটি ইমিউটেবল ডেটা স্ট্রাকচার ব্যবহার করে এবং তার মধ্যে ভেক্টর, লিস্ট, সেট, ম্যাপ ইত্যাদি অন্তর্ভুক্ত। এগুলি সব ইমিউটেবল এবং পার্সিস্টেন্ট।
Java: Java-তে Collections Framework এর মধ্যে List, Set, Queue, Map এবং আরও অনেক ধরনের ডেটা স্ট্রাকচার রয়েছে। Java-তে কিছু সংগ্রহ মিউটেবল (mutable) এবং কিছু সংগ্রহ ইমিউটেবল (immutable) হতে পারে।
Clojure:
(def my-vector [1 2 3 4]) ; Vector
(def my-map {:a 1 :b 2}) ; Map
(def my-set #{1 2 3}) ; Set
Java:
List<Integer> myList = new ArrayList<>();
Set<Integer> mySet = new HashSet<>();
Map<String, Integer> myMap = new HashMap<>();
Clojure: Clojure-এ ব্যবহৃত ইমিউটেবল ডেটা স্ট্রাকচারগুলো পরিবর্তন না করে নতুন স্ট্রাকচার তৈরি করে, ফলে কিছু ক্ষেত্রে কার্যক্ষমতা কম হতে পারে। তবে, Clojure উন্নত পার্সিস্টেন্ট ডেটা কাঠামো ব্যবহার করে, যা অধিকাংশ ক্ষেত্রে মেমোরি সাশ্রয়ী এবং দ্রুত।
Java: Java-তে, mutable সংগ্রহগুলো দ্রুত এবং দক্ষ, কারণ ডেটা পরিবর্তন করার সময় নতুন স্ট্রাকচার তৈরি হয় না, তবে জটিল অপারেশনের ক্ষেত্রে ডেটার কপি তৈরি করা প্রয়োজন হতে পারে।
Clojure: Clojure একটি শক্তিশালী lazy sequences সাপোর্ট করে, যেখানে এক্সপ্রেশনগুলো তখনই মূল্যায়ন হয় যখন প্রয়োজন হয়। এটি বিশেষ করে বড় ডেটাসেটের ক্ষেত্রে মেমোরি সাশ্রয়ী উপায়ে কাজ করতে সাহায্য করে।
Java: Java-তে lazy অপারেশন শুধুমাত্র Streams API এর মাধ্যমে পাওয়া যায়, যা মূলত একটি ইম্প্লিমেন্টেশন, এবং এটি ক্লোজারের মত স্বাভাবিকভাবে পুরোপুরি lazy সিকোয়েন্স নয়।
Clojure:
(def my-sequence (take 10 (map inc (range))))
(println my-sequence) ; (1 2 3 4 5 6 7 8 9 10)
Java:
Stream<Integer> stream = Stream.iterate(0, n -> n + 1).limit(10).map(n -> n + 1);
stream.forEach(System.out::println); // [1 2 3 4 5 6 7 8 9 10]
বৈশিষ্ট্য | Clojure | Java |
---|---|---|
ইমিউটেবিলিটি | সব ডেটা স্ট্রাকচার ইমিউটেবল | কিছু স্ট্রাকচার মিউটেবল, কিছু ইমিউটেবল |
কনকারেন্সি | কনকারেন্ট প্রোগ্রামিং সহজ, ইমিউটেবল ডেটা ব্যবহার | মিউটেবল ডেটা নিয়ে কাজ, সিঙ্ক্রোনাইজেশন প্রয়োজন |
ফাংশনাল প্রোগ্রামিং | ফাংশনাল প্রোগ্রামিং এর সাথে উপযোগী | কিছু ফাংশনাল স্টাইলের সমর্থন (Streams API) |
Lazy Sequences | Lazy sequences সমর্থন | Streams API মাধ্যমে lazy সমর্থিত |
সামাজিক ব্যবহার | ইমিউটেবল, পার্সিস্টেন্ট ডেটা স্ট্রাকচার | মিউটেবল ডেটা স্ট্রাকচার এবং ঐতিহ্যবাহী API |
Clojure এবং Java-র মধ্যে সংগ্রহ ব্যবস্থাপনায় অনেক পার্থক্য রয়েছে, তবে Clojure এর ইমিউটেবল, ফাংশনাল এবং কনকারেন্ট কাঠামো Java এর ঐতিহ্যবাহী মিউটেবল কাঠামোর থেকে আরও নিরাপদ, সাশ্রয়ী এবং কার্যকরী।
Clojure হল একটি JVM (Java Virtual Machine)-ভিত্তিক প্রোগ্রামিং ভাষা, যার মানে হল যে Clojure সহজেই Java API এবং Java লাইব্রেরি ব্যবহার করতে পারে। Clojure এবং Java এর সমন্বয় Clojure প্রোগ্রামারদের Java ইকোসিস্টেমের শক্তি ব্যবহার করতে সক্ষম করে, যেমনঃ জাভা ক্লাস, মেথড, এবং লাইব্রেরি।
Clojure-এ Java API ব্যবহার করা খুবই সহজ, কারণ Clojure এবং Java দুটি একই রUNTIME এর উপর চলে। Clojure তে Java API ব্যবহারের জন্য সাধারণত দুটি পদ্ধতি ব্যবহার করা হয়:
নিচে এই দুইটি পদ্ধতির বিস্তারিত আলোচনা করা হল।
Clojure-এর মধ্যে Java ক্লাস এবং মেথড কল করার জন্য, আপনাকে .
(dot notation) ব্যবহার করতে হবে, যা Java মেথড কলের স্ট্যান্ডার্ড পদ্ধতি। এটি একইভাবে Java থেকে ক্লাস ও মেথড কলের মতো কাজ করে।
String
ক্লাস ব্যবহারClojure থেকে Java-র String
ক্লাসের মেথড কল করা।
(def my-string (new java.lang.String "Hello, Clojure!"))
; String ক্লাসের length() মেথড কল করা
(println (.length my-string)) ; আউটপুট: 15
; String ক্লাসের toUpperCase() মেথড কল করা
(println (.toUpperCase my-string)) ; আউটপুট: "HELLO, CLOJURE!"
এখানে, .length
এবং .toUpperCase
Java এর String
ক্লাসের মেথড, যেগুলো Clojure-এ .
(dot notation) দিয়ে কল করা হয়েছে।
ArrayList
ব্যবহারJava ক্লাস ArrayList
ব্যবহার করে কিছু অপারেশন করা:
(def my-list (java.util.ArrayList.))
; add() মেথড কল করে কিছু আইটেম যোগ করা
(.add my-list "Apple")
(.add my-list "Banana")
(.add my-list "Orange")
; get() মেথড দিয়ে আইটেম গুলি বের করা
(println (.get my-list 0)) ; আউটপুট: "Apple"
(println (.get my-list 1)) ; আউটপুট: "Banana"
(println (.get my-list 2)) ; আউটপুট: "Orange"
এখানে, .add
এবং .get
Java এর ArrayList
ক্লাসের মেথড, যেগুলো Clojure তে ব্যবহার করা হয়েছে।
Clojure-এ Java objects ব্যবহার করার জন্য, Java ক্লাসের কন্সট্রাক্টর কল করতে new
কিওয়ার্ড ব্যবহার করা হয়। এর মাধ্যমে Java objects তৈরি করা যায় এবং Clojure-এ সেগুলোর সাথে কাজ করা সম্ভব হয়।
Date
object তৈরি করা; java.util.Date object তৈরি
(def my-date (java.util.Date.))
; Date object এর toString() মেথড কল করা
(println (.toString my-date)) ; আউটপুট: বর্তমান তারিখ এবং সময়
এখানে, java.util.Date
ক্লাসের কন্সট্রাক্টর দ্বারা একটি নতুন ডেট অবজেক্ট তৈরি করা হয়েছে এবং .toString
মেথড ব্যবহার করা হয়েছে তারিখ এবং সময় প্রিন্ট করতে।
Java তে স্ট্যাটিক মেথড এবং ফিল্ডের সাথে কাজ করতে Clojure-এ .
(dot notation) ব্যবহার করতে হয়। স্ট্যাটিক মেথড বা ফিল্ড কল করতে, ক্লাসের নামের আগে .
ব্যবহার করা হয়।
; Math ক্লাসের static method abs() কল করা
(println (. Math abs -10)) ; আউটপুট: 10
; Math ক্লাসের static field PI কল করা
(println (. Math PI)) ; আউটপুট: 3.141592653589793
এখানে, Math.abs
এবং Math.PI
হল Java ক্লাসের স্ট্যাটিক মেথড এবং স্ট্যাটিক ফিল্ড, যেগুলো Clojure-এ . Math
ব্যবহার করে কল করা হয়েছে।
Clojure তে Java এর Collections Framework ব্যবহার করা খুবই সহজ। Java এর ArrayList
, HashMap
, HashSet
ইত্যাদি ক্লাস গুলি Clojure তে ব্যবহার করা যেতে পারে।
HashMap
ব্যবহার; Java HashMap তৈরি
(def my-map (java.util.HashMap.))
; put() মেথড ব্যবহার করে key-value পেয়ার যোগ করা
(.put my-map "name" "Alice")
(.put my-map "age" 30)
; get() মেথড দিয়ে মান বের করা
(println (.get my-map "name")) ; আউটপুট: "Alice"
(println (.get my-map "age")) ; আউটপুট: 30
এখানে, HashMap
একটি Java ক্লাস যা Clojure তে ব্যবহার করা হয়েছে এবং put
এবং get
মেথডের মাধ্যমে মান যোগ এবং প্রাপ্তি করা হয়েছে।
Clojure তে Java exceptions এর সাথে কাজ করা খুবই সহজ। Clojure তে Java exceptions প্রক্ষেপণ (throw) এবং ধরা (catch) করতে try
এবং catch
ব্যবহার করা হয়, যা Java তে যেমন ব্যবহৃত হয় তেমনি।
(try
(throw (java.lang.Exception. "Something went wrong!"))
(catch java.lang.Exception e
(println "Caught exception: " (.getMessage e))))
এখানে, একটি java.lang.Exception
থ্রো করা হয়েছে এবং catch
ব্লকের মাধ্যমে সেই এক্সসেপশনটি ধরা হয়েছে।
Clojure এবং Java-এর পারস্পরিক ইন্টারঅপারেবিলিটি মূলত নিম্নলিখিত দিকগুলোতে প্রয়োগ হয়:
HashMap
, ArrayList
, HashSet
) ব্যবহার করা যায়।Clojure এবং Java এর মধ্যে পারস্পরিক ইন্টারঅপারেবিলিটি খুবই শক্তিশালী, কারণ Clojure Java Virtual Machine (JVM) এর উপর চলে এবং Java API সহজেই ব্যবহার করা যায়। Clojure তে Java ক্লাস, মেথড, ফিল্ড এবং এক্সসেপশন হ্যান্ডলিং খুবই সহজে একত্রে কাজ করতে পারে, যা Clojure এর ডেভেলপারদের Java এর বিশাল লাইব্রেরি ব্যবহার করার সুবিধা দেয়।
common.read_more